package LimitedTimeGame.Day_0224;

/**
 * @author zxc
 * @date 2023/02/24 08:38
 **/

import java.util.HashMap;
import java.util.HashSet;

/**
 * 题目 ：无人机方针
 * 题目详述 ：
 * 在 「力扣挑战赛」 开幕式的压轴节目 「无人机方阵」中，每一架无人机展示一种灯光颜色。 无人机方阵通过两种操作进行颜色图案变换：
 * 调整无人机的位置布局
 * 切换无人机展示的灯光颜色
 * 给定两个大小均为 N*M 的二维数组 source 和 target 表示无人机方阵表演的两种颜色图案，
 * 由于无人机切换灯光颜色的耗能很大，请返回从 source 到 target 最少需要多少架无人机切换灯光颜色。
 * 注意： 调整无人机的位置布局时无人机的位置可以随意变动。
 *
 * 提示 ：
 * n == source.length == target.length
 * m == source[i].length == target[i].length
 * 1 <= n, m <=100
 * 1 <= source[i][j], target[i][j] <=10^4
 *
 *
 */
public class MinimumSwitchingTimes {
    /**
     * 思路 ：
     * ===》
     * 即，统计source数组中各种不同灯光的数量 && target数组中各种不同灯光的数量
     * （1）若是target数组中不同灯光出现的数量 和source数组中不同灯光出现的数量是大体上一致的，则只需要移动即可;
     * （2）若是不一致的话，则要统计差异;（一次灯光的变换，可以消除两部差异）
     *
     * @param source
     * @param target
     * @return
     */
    public int minimumSwitchingTimes(int[][] source, int[][] target) {
        int m = source.length;
        int n = source[0].length;
        HashMap<Integer , Integer> hashMap = new HashMap<>();
        HashSet<Integer> hashSet = new HashSet<>();
        for(int i = 0 ; i < m ; i++){
            for(int j = 0 ; j < n ; j++){
                hashSet.add(source[i][j]);
                hashMap.put(source[i][j] , hashMap.getOrDefault(source[i][j] , 0) + 1);
                hashSet.add(target[i][j]);
                hashMap.put(target[i][j] , hashMap.getOrDefault(target[i][j] , 0) - 1);
            }
        }
        int sum = 0;
        for (Integer key : hashSet) {
            if(hashMap.get(key) > 0){
                sum += Math.abs(hashMap.get(key));
            }
        }
        return sum;
    }
}
